/*
CGLIB全称为CodeGenerationLibrary，是一个基于AsM的字节码生成库，它允许我们在运行时对字节码进行修改和动态生成。CGLIB通过继
承方式实现代理。Spring的AOP模块中就使用到了CGLIB:如果目标对象实现了接口，默认采用JDK动态代理，否则使用CGLOB动态代理
实现CGLIB动态代理，我们需要重点关注MethodInterceptor接口和Enhancer类

CGLIB需要引入pom文件
1．定义一个类，不需要接口了，实现CGLIB代理
2. 自定义MethodInterceptor并重写intercept方法，intercept用于拦截增强被代理的方法（类似于JDK动态代理中的invoke方法)
3. 通过 Enhancer类的create()创建代理类

 */

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

//1
class SuperStar {
    private String name;
    public SuperStar(String name){
        this.name = name;
    }
    public SuperStar(){
        this.name = "kun";
    }

    public void readLetter(String letter){
        System.out.println("I am " + name + " , I will read " + letter);
    }
}

//2,org.springframework.cglib.proxy.MethodInterceptor
class StarMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable{
        System.out.println("before");
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("after");
        return result;
    }
}

//3
class CglibProxyFactor {
    public static SuperStar getProxy(){
        // 创建Enhancer对象
        Enhancer enhancer = new Enhancer();
        // 设置被代理类
        enhancer.setSuperclass(SuperStar.class);
        //设置方法拦截器
        enhancer.setCallback(new StarMethodInterceptor());
        // 创建代理类
        return (SuperStar)enhancer.create();
    }
}


public class CGLIBDynamicProxy {
    public static void main(String[] args){
        //创建代理类
        SuperStar proxy = CglibProxyFactor.getProxy();

        //调用代理类
        proxy.readLetter("I love you");
    }
}

